#ifndef __SOFT_IIC_H__
#define __SOFT_IIC_H__
#include "hwlayer.h"
/****************************************************************************************
宏接口，每次需要修改软件定义IIC的时候，仅需实现宏对应宏即可
****************************************************************************************/


//初始化IO口
//1.SCK时钟线 =>PA0
//2.SDA =>PA1 无需在此处初始化，因为后续在使用中会进行输入输出配置
//取而代之的是两个SDA的输入输出状态宏
#define GPIO_INIT()                                                                   \
    do                                                                                \
    {                                                                                 \
        rcu_periph_clock_enable(RCU_GPIOA);                                           \
        gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0);           \
        gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0); \
        SDA_OUT();\
        SDA_SET();\
        SCL_SET();\
    } while (0)

//将IO设置为输入状态宏函数，用于下方调用
#define SDA_IN()                                                             \
    do                                                                       \
    {                                                                        \
        gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_1); \
    } while (0)

#define SDA_OUT()                                                                     \
    do                                                                                \
    {                                                                                 \
        gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_1);           \
        gpio_output_options_set(GPIOA, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_1); \
    } while (0)
//SDA置位
#define SDA_SET() GPIO_BOP(GPIOA) = GPIO_PIN_1
//SDA重置
#define SDA_RESET() GPIO_BC(GPIOA) = GPIO_PIN_1
//SCL置位
#define SCL_SET() GPIO_BOP(GPIOA) = GPIO_PIN_0
//SCL重置
#define SCL_RESET() GPIO_BC(GPIOA) = GPIO_PIN_0

//根据外部来做判断并设置SDA置位状态
#define SDA_BIT(x)                    \
    if (((unsigned char)(x)) != 0)    \
    {                                 \
        GPIO_BOP(GPIOA) = GPIO_PIN_1; \
    }                                 \
    else                              \
    {                                 \
        GPIO_BC(GPIOA) = GPIO_PIN_1;  \
    }
//读取SDA口状态，0或1
#define SDA_GET() gpio_input_bit_get(GPIOA, GPIO_PIN_1)
//微秒级延时函数
#define DELAY(x) hwl_delay_us(x)

//速度缩放
#define DELAYFACT 1


/****************************************************************************************/

/*调用接口*/
void soft_iic_init(void);
void soft_iic_start(void);
void soft_iic_stop(void);
unsigned char soft_iic_wait_ack(void);
void soft_iic_ack(unsigned char ack_nack);
void soft_iic_writeByte(unsigned char val);
unsigned char soft_iic_readByte(unsigned char ack);
#endif
